#-*-coding:utf-8 -*-

import csv  
import random  
import math  
import operator  
  
def loadDataset(filename,split,trainingSet=[],testSet=[]):  
    with open(filename,'rb') as csvfile:  
        lines = csv.reader(csvfile)  
        dataset = list(lines)  
        for x in range(len(dataset) - 1):  
            for y in range(len(dataset[x])-1):  
                dataset[x][y] = float(dataset[x][y])  
            if random.random() < split:  
                trainingSet.append(dataset[x])  
            else:  
                testSet.append(dataset[x])  

#计算两点的距离
def euclideanDistance(instance1,instance2):  
    distance = 0  
    print(instance1)  
    print("instance1 length = " + str(len(instance1)))  
    print("bird-sup")  
    print(instance2)  
    print("instance2 length = " + str(len(instance2)))  
    for x in range(len(instance1)-1):  
        distance += pow((instance1[x] - instance2[x]),2)  
    return math.sqrt(distance)  

#获取训练集中与testInstance最近的点
def getNeighbors(trainingSet, testInstance, k):  
    distances = []  
    print("trainingSet\'s length: "+str(len(trainingSet[0])))  
    print(trainingSet[0])  
    print(testInstance)  
    print("testInstance\'s length: "+str(len(testInstance)))  
    for x in range(len(trainingSet)):  
        dist = euclideanDistance(testInstance,trainingSet[x])  
        distances.append((trainingSet[x], dist))  
    distances.sort(key=operator.itemgetter(1))  
    neighbors = []  
    for x in range(k):  
        neighbors.append(distances[x][0])  
    return neighbors  
  
def getResponse(neighbors):  
    classVotes = {}  
    for x in range(len(neighbors)):  
        response = neighbors[x][-1]  
        if response in classVotes:  
            classVotes[response] += 1  
        else:  
            classVotes[response] = 1  
    sortedVotes = sorted(classVotes.iteritems(),key=operator.itemgetter(1),reverse=True)  
    return sortedVotes[0][0]  

#预测分类
def getAccuracy(testSet,predictions):  
    correct = 0  
    for x in range(len(testSet)):  
        if testSet[x][-1] == predictions[x]:  
            correct += 1  
    return (correct/float(len(testSet))) * 100.0  
  
def main():  
    trainingSet = []  
    testSet = []  
    split = 0.67  
    loadDataset(r'E:\\data\\iris_data.txt',split,trainingSet,testSet)  
    print 'Train set: ' + repr(len(trainingSet))  
    print 'Test set: ' + repr(len(testSet))  
    predictions = []  
    k = 3  
    for x in range(len(testSet)):  
        neighbors = getNeighbors(trainingSet,testSet[x],k)  
        result = getResponse(neighbors)  
        predictions.append(result)  
        print('>predicted=' + repr(result) + ',actual=' + repr(testSet[x][-1]))  
    accuracy = getAccuracy(testSet,predictions)  
    print('Accuracy: ' + repr(accuracy) + '%')  
      
main()  